进行 fine-tune 操作需要微调训练所有层,所以迭代训练次数比较多。
1 数据准备
准备好tfrecord格式的图片数据文件,和labels.txt。可以参考上篇。
2 定义新的dataset文件
首先,在dataset/目录下新建一个文件夹 satellite.py,并将flowers.py文件夹中的内容复制到 satellite.py 中,接下来需要修改以下几处内容。
第一处修改,
第二处修改修改为image/format部分1
'image/format': tf.FixedLenFeature((), tf.string, default_value='jpg'),
修改完 satellite.py后,还需要在同目录的dataset_factory.py文件夹中注册satellite数据库。红色框内为新增加的satellite数据
3 下载训练好的inception-v3模型
在http://download.tensorflow.org/models/inception_v3_2016_08_28.tar.gz 下载并解压后,会得到一个inception_v3.ckpt 文件
4 开始训练
在slim文件夹下运行下面脚本开始训练:
(★注意:如果softmax报错,修改文件D:\Anaconda3\Lib\site-packages\tensorflow\python\framework\ops.py
第3385行,在函数 create_op() 内新增一行with tf.device('/cpu:0'):
)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20python train_image_classifier.py ^
--train_dir=model2 :训练好的模型存放目录 ^
--dataset_name=satellite :用于读取tfrecord数据集的python文件 ^
--dataset_split_name=train :这里使用切分的训练集 ^
--dataset_dir=images2 :tfrecord文件目录 ^
--batch_size=5 :GPU内存小的建议不要改大,否则报错 ^
--max_number_of_steps=1000 :训练次数 ^
--model_name=inception_v3 :训练模型 ^
--checkpoint_path=D:/Tensorflow/models/inception2016/inception_v3.ckpt :fine-tune专用^
--checkpoint_exclude_scopes=InceptionV3/Logits,InceptionV3/AuxLogits :fine-tune专用^
--trainable_scopes=InceptionV3/Logits,InceptionV3/AuxLogits :fine-tune专用^
--learning_rate=0.001 ^
--learning_rate_decay_type=fixed ^
--save_interval_secs=300 ^
--save_summaries_secs=2 ^
--log_every_n_steps=10 ^
--optimizer=rmsprop ^
--weight_decay=0.00004 ^
--clone_on_cpu=false :可以设置为true指定CPU执行
pause
如图,一般训练10000步左右可以达到准确率要求,ctrl+c 停止脚本程序
5 验证模型准确率
可以用eval_image_classifier.py程序进行验证,在slim文件夹下运行以下脚本
1 | python test_image_classifier.py ^ |
得到训练后模型的accuracy结果:
6 导出模型,并对单张图片进行识别
STEP 1:导出网络结构
在slim文件夹下运行以下脚本1
2
3
4
5
6python export_inference_graph.py ^
--alsologtostderr ^
--model_name=inception_v3 ^
--output_file=model2/inception_v3_inf_graph.pb ^
--dataset_name=satellite
pause
这个命令会在 model2 文件夹下生成一个inception_v3_inf_graph.pb文件。(注:inception_v3_inf_graph.pb文件夹只保存了inception_v3的网络结构并不包含训练得到的模型。
STEP 2:生成完整的 .pd 模型文件
运行下面脚本,将checkpoint中的模型参数保存进来,转换成完整的模型文件。(需将8100改成model文件夹中保存的实际的模型训练步数)1
2
3
4
5
6
7python freeze_graph.py ^
--input_graph=model2/inception_v3_inf_graph.pb ^
--input_checkpoint=model2/model.ckpt-8100 ^
--input_binary=true ^
--output_node_names=InceptionV3/Predictions/Reshape_1 ^
--output_graph=model2/frozen_graph.pb
pause
STEP 3:运行导出模型分类单张图片
运行下面脚本1
2
3
4
5python test_image_classifier.py ^
--model_path model2/frozen_graph.pb ^
--label_path images2/labels.txt ^
--image_file test_images/water.jpg
pause
分类结果如下:
总结:
脚本的运行顺序如图编号所示